import time

import pytest
import requests

from api.reg_login_api import RegLoginApi

from common.util import common_assert, clear_user_info, read_json


class TestRegLogin(object):
    def setup_class(self):
        # 调用数据初始化方法
        clear_user_info()

    def setup(self):
        # 1.创建session对象
        self.ses = requests.session()
        # 2.实例化封装接口请求的类，获取类的对象
        self.reg_login_api = RegLoginApi(self.ses)

    @pytest.mark.parametrize("r,exp_status_code", read_json("reg_login_data", "img_verify_code"))
    # 获取图片验证码测试用例
    def test01_img_verify_code(self, r, exp_status_code):
        # 3.调用实例化类的对象，获取封装注册图片验证码接口请求的方法，拿到该接口的响应数据
        resp = self.reg_login_api.get_img_verify_code(r)
        # 4.断言
        assert exp_status_code == resp.status_code

    @pytest.mark.parametrize("phone,phone_verify_code,exp_status_code,exp_description",
                             read_json("reg_login_data", "phone_verify_code"))
    # 获取短信验证码测试用例
    def test02_phone_verify_code(self, phone, phone_verify_code, exp_status_code, exp_description):
        # 3.调用实例化类的对象，实现获取注册图片验证码接口请求
        self.reg_login_api.get_img_verify_code(123332123123)
        # 4.调用实例化类的对象，实现获取注册短信验证码接口请求，拿到该接口的响应数据
        resp = self.reg_login_api.get_phone_verify_code(phone, phone_verify_code)
        # 5.断言
        common_assert(resp, exp_status_code, exp_description)

    @pytest.mark.parametrize("exp_form_dict,exp_status,exp_description", read_json("reg_login_data", "user_register"))
    # 注册测试用例
    def test03_register(self, exp_form_dict, exp_status, exp_description):
        # 1.实现获取注册图片验证码接口
        self.reg_login_api.get_img_verify_code(123332123123)
        # 2.实现获取注册短信验证码接口
        self.reg_login_api.get_phone_verify_code(exp_form_dict.get("phone"), "8888")
        # 3.调用封装注册接口请求的方法，获取响应数据
        form_dict = exp_form_dict
        resp = self.reg_login_api.user_register(exp_form_dict)
        # 4.断言
        common_assert(resp, exp_status, exp_description)

    @pytest.mark.parametrize("phone,pwd,exp_status_code,exp_des", read_json("reg_login_data", "user_login"))
    # 登录测试用例
    def test04_user_login(self, phone, pwd, exp_status_code, exp_des):
        # 1.调用封装登录接口请求的方法，获取响应数据
        resp = self.reg_login_api.user_login(phone, pwd)
        # 2.断言
        common_assert(resp, exp_status_code, exp_des)

    @pytest.mark.skip  # 跳过函数
    # 登录密码错误次数校验
    def test05_user_login_error(self):
        ##1、调用封装登录接口请求的方法，密码错误，请求失败1次
        resp1 = self.reg_login_api.user_login("18743264321", "123")
        common_assert(resp1, 100, "错误1次")

        ##2、调用封装登录接口请求的方法，密码错误，请求失败2次
        resp2 = self.reg_login_api.user_login("18743264321", "123")
        common_assert(resp2, 100, "错误2次")

        ##3、调用封装登录接口请求的方法，密码错误，请求失败3次
        resp3 = self.reg_login_api.user_login("18743264321", "123")
        common_assert(resp3, 100, "锁定")

        ## 4、等待60s，调用封装登录接口请求的方法，密码正确，请求成功，获取响应数据
        time.sleep(60)
        resp = self.reg_login_api.user_login("18743264321", "qqq123")
        common_assert(resp, 200, "成功")
